package com.draven.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.draven.entity.FinanceRecord;
import com.draven.vo.FinanceStatVO;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

/**
 * 收支记录服务接口
 */
public interface FinanceRecordService {

    /**
     * 添加收支记录
     *
     * @param userId     用户ID
     * @param type       类型（1收入 2支出）
     * @param amount     金额
     * @param category   分类
     * @param recordTime 记录时间
     * @param remark     备注
     * @return ID
     */
    Long add(Long userId, Integer type, BigDecimal amount, String category, Date recordTime, String remark);

    /**
     * 修改收支记录
     *
     * @param id         ID
     * @param userId     用户ID
     * @param type       类型（1收入 2支出）
     * @param amount     金额
     * @param category   分类
     * @param recordTime 记录时间
     * @param remark     备注
     */
    void update(Long id, Long userId, Integer type, BigDecimal amount, String category, Date recordTime, String remark);

    /**
     * 删除收支记录
     *
     * @param id     ID
     * @param userId 用户ID
     */
    void delete(Long id, Long userId);

    /**
     * 获取收支记录详情
     *
     * @param id     ID
     * @param userId 用户ID
     * @return 收支记录信息
     */
    FinanceRecord getDetail(Long id, Long userId);

    /**
     * 分页查询收支记录
     *
     * @param userId    用户ID
     * @param type      类型（1收入 2支出）
     * @param category  分类
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @param pageNum   页码
     * @param pageSize  每页数量
     * @return 分页结果
     */
    Page<FinanceRecord> page(Long userId, Integer type, String category, Date startTime, Date endTime, Integer pageNum, Integer pageSize);

    /**
     * 统计收支情况
     *
     * @param userId    用户ID
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @return 统计结果
     */
    FinanceStatVO stat(Long userId, Date startTime, Date endTime);

    /**
     * 按分类统计收支情况
     *
     * @param userId    用户ID
     * @param type      类型（1收入 2支出）
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @return 统计结果
     */
    List<FinanceStatVO.CategoryStat> statByCategory(Long userId, Integer type, Date startTime, Date endTime);
} 